package top.wangjiu.java.jvm.attribute;

import top.wangjiu.java.jvm.AttributeInfo;
import top.wangjiu.java.jvm.constantinfo.ConstantPoolInfo;

/**
 * Synthetic属性表示该字段或方法不是由Java源码直接产生的，而是由编译器自行添加的
 * 是标志类型的布尔属性，只存在有和没有的区别，没有属性值的概念
 * 当然也可设置访问标志中的ACC_SYNTHETIC标志，所有由非用户代码产生的类、方法和字段都应当至少设置Synthetic属性和ACC_SYNTHETIC标志位中的一项，
 * 唯一的例外是实例构造器<init>和类构造器<clinit>方法
 *
 * 当然attribute_length的值必须为0x00000000
 */
public class SyntheticAttr extends AttributeInfo {

    public final static String NAME = "Synthetic";

    private final short attributeNameIndex;   //属性名索引
    private final int attributeLength;       //属性长度

    public SyntheticAttr(short attributeNameIndex, int attributeLength){
        this.attributeNameIndex = attributeNameIndex;
        this.attributeLength = attributeLength;
    }


    @Override
    public short attributeNameIndex() {
        return attributeNameIndex;
    }

    @Override
    public int attributeLength() {
        return attributeLength;
    }

    @Override
    public String toString(ConstantPoolInfo[] poolInfos) {
        return "Synthetic:true";
    }
}
